package com.gitee.validation;

import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.GroupSequence;
import javax.validation.Valid;
import javax.validation.constraints.*;
import javax.validation.groups.Default;
import java.util.Date;
import java.util.List;

/**
 * 验证实体类
 *
 * @author gcq
 * @Create 2022-07-17
 */
@Data
public class UserInfo {

    public UserInfo() {

    }

    // 登录组
    public interface LoginGroup{}
    // 注册组
    public interface RegisterGroup{}
    // 组排序场景
    @GroupSequence({
            LoginGroup.class,
            RegisterGroup.class,
            Default.class // 默认没有声明分组属性的
    })
    public interface Group{}

    /**
     * 用户Id
     * 不同场景的验证,有些场景就需要填写，有些场景就不需要填写
     * 传入对应的场景接口，就说明需要进行验证
     */
    @NotNull(message = "用户ID不能为空", groups = LoginGroup.class)
    private String userId;
    /**
     * notEmpty 不会去掉前后空格
     */
    @NotEmpty(message = "用户名不能为空")
    private String userName;
    /**
     * 用户密码
     * NotBlank 自动去掉字符串前后空格验证是否为空
     */
    @NotBlank(message = "用户密码不能为空")
    @Length(min = 6, max = 20, message = "密码长度不能小于6位，不能大于20位")
    private String passWord;

    @NotNull(message = "用户邮箱不能为空", groups = RegisterGroup.class)
    @Email(message = "邮箱必须为有效邮箱")
    private String email;

    @Max(value = 60, message = "年龄不能大于60岁")
    @Min(value = 18, message = "年龄不能小于18岁")
    private Integer age;

    @Phone(message = "手机号不正确")
    private String phone;
    /**
     * 生日
     * @Past 如果日期是现在的或者未来的那么这个日期就不通过
     */
    @Past(message = "生日不能是未来时间点")
    private Date birthday;
    /**
     * 用户列表
     * 如何对集合中的 UserInfo 进行验证 只需要标注 @Valid
     */
    @Size(min = 1, message = "最少需要有一个好友")
    private List<@Valid UserInfo> friends;
}